package heima_bixiangdong.join;


class Demo implements Runnable {
    @Override
    public void run() {
        for (int i = 1; i <= 40; i++) {
            System.out.println(Thread.currentThread().getName() + "---->" + i);
            //Thread.yield();// 让当前线程临时暂停执行，比如在之前的售票例子中，使用这个方法，可以防止某一个线程把活全部都干完了，而其他线程闲置的问题
        }
    }
}


public class ThreadJoinDemo {
    public static void main(String[] args) {
        //test1();
        test2();
    }

    private static void test2() {
        Demo d = new Demo();
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i <= 40; i++) {
                    System.out.println(Thread.currentThread().getName() + "---->" + i);
                }
            }
        });

        t1.start();

        /**
         * 主线程执行到这里时，调用了t1.join方法，此时主线程释放了CPU的执行权（处于阻塞状态）
         * 主线程要等到t1线程执行完毕之后，才有机会获得CUP的执行权，当主线程再次获得CPU的执行
         * 权后，会继续往下执行，开启一个新的线程t2，然后主线程就会和t2线程抢夺CPU的执行权，体现
         * 在输出中就是：t1线程先全部执行完毕之后，主线程和t2线程交替执行
         *
         * 应用场景：一般用于临时加入一个运行线程，并让该线程运算完之后，之前的线程(程序)才继续执行
         */
        try {
            t1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i <= 40; i++) {
                    System.out.println(Thread.currentThread().getName() + "---->" + i);
                }
            }
        });

        t2.start();
        for (int i = 1; i <= 50; i++) {
            System.out.println("main --->" + i);
        }
        System.out.println("over");
    }

    private static void test1() {
        Demo d = new Demo();
        Thread t1 = new Thread(d);
        Thread t2 = new Thread(d);

        t1.start();
        try {
            t1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t2.start();

        for (int i = 1; i <= 50; i++) {
            System.out.println("main --->" + i);
        }
        System.out.println("over");
    }
}
